<!DOCTYPE html>
<html>
  <head>
    <meta charset='utf-8'>

    <link rel="stylesheet" type="text/css" 
      href="/assets/css/straybirds.css" media="screen" />
    <link rel="stylesheet" type="text/css" 
      href="/assets/css/pygments.css" media="screen" />

    <!-- MathJax Section Start -->

    <script type="text/javascript"
    src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML">
    </script>
    <script>
        MathJax.Hub.Config({
              tex2jax: {
              skipTags: ['script', 'noscript', 'style', 'textarea', 'pre']
              }
        });
        MathJax.Hub.Queue(function() {
            var all = MathJax.Hub.getAllJax(), i;
            for(i=0; i < all.length; i += 1) {
                all[i].SourceElement().parentNode.className += ' has-jax';
            }
        });
    </script>

    <!-- MathJax Section End -->

    <!-- Google Analytics Start-->
    <script>
  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

  ga('create', 'UA-48100787-1', 'minixalpha.github.io');
  ga('send', 'pageview');

</script>

    <!-- Google Analytics End -->

    <title>GCC 的基本使用</title>
  </head>

  <body>
    <div class="container">
      <header>
        <div class="container">
          <h1>
              <a href="/" title="Home Page"> 潇湘夜雨 </a>
          <span class="github-src">
            <a href ="https://github.com/minixalpha/minixalpha.github.io"
               target="_blank"
               title="Fork me on GitHub">
              <img src="/assets/images/GitHub-Mark-Light-32px.png" alt="">
            </a>
          </span>
          </h1>
        </div>
      </header>

      <aside id="left-side">
        <h2> 分类 </h2>
  <ul class="category-list">
      
            
                <li>
                <a href="/categories/计算机系统"> 计算机系统 (3) </a>
                </li>
            
      
            
                <li>
                <a href="/categories/java"> java (1) </a>
                </li>
            
      
            
                <li>
                <a href="/categories/技术"> 技术 (5) </a>
                </li>
            
      
            
                <li>
                <a href="/categories/工具"> 工具 (4) </a>
                </li>
            
      
            
                <li>
                <a href="/categories/科研"> 科研 (5) </a>
                </li>
            
      
            
                <li>
                <a href="/categories/生活"> 生活 (1) </a>
                </li>
            
      
            
                <li>
                <a href="/categories/思想"> 思想 (2) </a>
                </li>
            
      
            
                <li>
                <a href="/categories/c语言"> c语言 (4) </a>
                </li>
            
      
            
                <li>
                <a href="/categories/虚拟机"> 虚拟机 (1) </a>
                </li>
            
      
            
                <li>
                <a href="/categories/英语"> 英语 (8) </a>
                </li>
            
      
            
                <li>
                <a href="/categories/读书"> 读书 (1) </a>
                </li>
            
      
            
                <li>
                <a href="/categories/源代码阅读"> 源代码阅读 (10) </a>
                </li>
            
      
  </ul>

      </aside>

      <aside id="right-side">
        <h2> 归档 </h2>
  <ul class="archive-list">
    
    
    
        
        
        
        
            
            <li>
                <a href="/2014/05">
                    2014-05 (1)
                </a>
            </li>

        
        
    
        
        
        
        
    
        
        
        
        
    
        
        
        
        
            
            <li>
                <a href="/2014/04">
                    2014-04 (3)
                </a>
            </li>

        
        
    
        
        
        
        
    
        
        
        
        
    
        
        
        
        
    
        
        
        
        
    
        
        
        
        
    
        
        
        
        
    
        
        
        
        
    
        
        
        
        
    
        
        
        
        
    
        
        
        
        
    
        
        
        
        
            
            <li>
                <a href="/2014/03">
                    2014-03 (11)
                </a>
            </li>

        
        
    
        
        
        
        
    
        
        
        
        
    
        
        
        
        
    
        
        
        
        
    
        
        
        
        
    
        
        
        
        
            
            <li>
                <a href="/2014/02">
                    2014-02 (6)
                </a>
            </li>

        
        
    
        
        
        
        
    
        
        
        
        
    
        
        
        
        
            
            <li>
                <a href="/2014/01">
                    2014-01 (3)
                </a>
            </li>

        
        
    
        
        
        
        
    
        
        
        
        
    
        
        
        
        
    
        
        
        
        
    
        
        
        
        
    
        
        
        
        
    
        
        
        
        
    
        
        
        
        
    
        
        
        
        
    
        
        
        
        
            
            <li>
                <a href="/2013/11">
                    2013-11 (10)
                </a>
            </li>

        
        
    
        
        
        
        
    
        
        
        
        
    
        
        
        
        
            
            <li>
                <a href="/2013/10">
                    2013-10 (3)
                </a>
            </li>

        
        
    
  </ul>

      </aside>

      <article>

<h1>GCC 的基本使用</h1>

<p><a href="http://gcc.gnu.org/">GCC</a> 是一款非常著名的编译器，支持诸如 C, C++, Java在内的多种程序设计语言，并且提供了许多选项，以支持用户不同程度的需求，例如查看编译中间结果，指定语言标准，指定优化程度等等 ，下面的内容就介绍这些最重要的功能。</p>

<p>首先查看一下 GCC 的版本，有时候可能版本不同，编译的功能和结果就不同。
<a href="http://gcc.gnu.org/onlinedocs/">这里</a> 有不同版本的手册。</p>

<h2>查看版本</h2>
<div class="highlight"><pre><code class="text language-text" data-lang="text">$ gcc --version
gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
Copyright (C) 2011 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
</code></pre></div>
<h2>编译过程</h2>

<h3>一次编译</h3>

<p>如果想直接得到可执行文件，最简单的是这样：</p>
<div class="highlight"><pre><code class="text language-text" data-lang="text">    gcc test.c -o test
</code></pre></div>
<h3>分段编译</h3>

<p>有时候，我们可能需要看到编译的中间结果，比如查看汇编代码，没有经过链接的二进制文件等等，这时候可以这样：</p>

<ul>
<li><p>源文件-&gt;预处理-&gt;中间文件  </p>
<div class="highlight"><pre><code class="text language-text" data-lang="text">gcc -E test.c -o test.i
</code></pre></div></li>
<li><p>中间文件-&gt;编译-&gt;汇编文件  </p>
<div class="highlight"><pre><code class="text language-text" data-lang="text">   gcc -S test.i -o test.s
</code></pre></div></li>
<li><p>汇编文件-&gt;转换-&gt;二进制代码  </p>
<div class="highlight"><pre><code class="text language-text" data-lang="text">   gcc -c test.s -o test.o
</code></pre></div></li>
<li><p>二进制代码-&gt;链接-&gt;可执行文件  </p>
<div class="highlight"><pre><code class="text language-text" data-lang="text">   gcc test.o -o test
</code></pre></div></li>
</ul>

<h2>设定C语言标准</h2>

<p>不同的标准对于语言特性的支持是不一样的，所以一定要关注标准，别写了半天程序连自己是在什么标准下写的都不知道。</p>

<p>关于C语言的标准，首先要提到的就是 ANSI C, 1989年批准，即C89，1990年批准成为ISO标准，即C90或ISO/IEC 9899:1990。C89和C90其实是一样的。可以使用 <code>-ansi</code> 或者  <code>-std=c89</code> 或者 <code>-std=c90</code> 或者<code>-std=iso9899:1990</code> 来指定，例如：</p>
<div class="highlight"><pre><code class="text language-text" data-lang="text"> $ gcc -ansi test.c -o test
 $ gcc -std=c89 test.c -o test
 $ gcc -std=iso9899:1990 test.c -o test
</code></pre></div>
<p>在1999年，新版本的C语言标准发布，即 ISO/IEC 9899:1999，江湖人称C99。C99引入了一些新特性，例如：inline 函数，long long int 类型，变长数组，单行注释等等 。GCC对此标准的支持并不完整，但许多新特性已经可以支持。可以使用<code>-std=c99</code> 或者 <code>-std=iso9899:1999</code> 来指定。</p>

<p>下一个版本的C语言标准是C1X，正在制定中，GCC只支持其中一部分特性，可以使用<code>-std=c1x</code>来指定。</p>

<p>另外，GCC对各个C语言标准都提供了一些扩展，可以使用 <code>-std=gnu89</code> 或者 <code>-std=gnu99</code> 或者 <code>-std=gnu1x</code>来指定。</p>

<p>如果没有指定标准，默认情况下 GCC 使用 <code>-std=gnu90</code>。</p>

<p>更多关于GCC支持的语言标准的描述，可以在这里找到：<a href="http://gcc.gnu.org/onlinedocs/gcc-4.6.4/gcc/Standards.html">Language Standards Supported by GCC</a>
。</p>

<p>关于各个标准的简介可以在 Wikipedia 的 C (programming language) 的 <a href="http://en.wikipedia.org/wiki/C_(programming_language">History</a>#History) 中找到，另外强烈建议把这个词条完整地阅读一遍，可以对C语言有一个全方位的概览。</p>

<p>ISO对于各个标准的介绍可以在 <a href="http://www.iso-9899.info/wiki/The_Standard#C89_.2F_C90_.2F_C95">iso9899</a>中找到。</p>

<h2>警告</h2>

<p>GCC 的警告信息有时候会给我们一些非常重要的提示，防止我们写出错误的程序，最常用的选项是 <code>-Wall</code>，意思是打开全部的警告信息。如果没有错误，仅仅是得到了警告，程序不会停止编译，因为警告不一定是错误的。但是如果你对程序要求比较高，想让编译器在出现警告时停止编译，那么可以在<code>-Wall</code>基础上，使用 <code>-Werror</code> 选项，这样GCC会把警告当成错误来处理。</p>

<p>例如，我们有这样一个程序：</p>
<div class="highlight"><pre><code class="c language-c" data-lang="c"><span class="cp">#include &lt;stdio.h&gt;</span>

<span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span> <span class="p">{</span>
    <span class="kt">int</span> <span class="n">foo</span> <span class="o">=</span> <span class="mi">2</span><span class="p">;</span>

    <span class="k">if</span> <span class="p">(</span><span class="n">foo</span> <span class="o">=</span> <span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">printf</span><span class="p">(</span><span class="s">&quot;hello, world</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">);</span>
    <span class="p">}</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div>
<p>注意 <code>=</code> 和 <code>==</code> 的区别，我们试试警告选项：</p>
<div class="highlight"><pre><code class="text language-text" data-lang="text">$ gcc -Wall -ansi test.c -o test
test.c: In function ‘main’:
test.c:6:5: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
</code></pre></div>
<p>可以看出，GCC对我们提出了警告。我们再加上 <code>-Werror</code> 试试：</p>
<div class="highlight"><pre><code class="text language-text" data-lang="text">$ gcc -Wall -Werror -ansi test.c -o test
test.c: In function ‘main’:
test.c:6:5: error: suggest parentheses around assignment used as truth value [-    Werror=parentheses]
cc1: all warnings being treated as errors
</code></pre></div>
<p>这一次，GCC把上一次的警告当成错误来处理了。</p>

<p>关于 GCC Warning 的更多信息可以在 GCC文档的 <a href="http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html">Warnign Options</a>中找到。</p>

<h2>调试信息</h2>

<p>有时候我们的程序需要使用 GDB 来调试，就需要在编译时加入调试信息，可以通过 <code>-g</code> 选项来加入：</p>
<div class="highlight"><pre><code class="text language-text" data-lang="text">$ gcc -g -ansi test.c -o test
</code></pre></div>
<p>然后通过 GDB 来调试:</p>
<div class="highlight"><pre><code class="text language-text" data-lang="text">$ gdb test
GNU gdb (Ubuntu/Linaro 7.4-2012.04-0ubuntu2.1) 7.4-2012.04
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later &lt;http://gnu.org/licenses/gpl.html&gt;
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type &quot;show copying&quot;
and &quot;show warranty&quot; for details.
This GDB was configured as &quot;i686-linux-gnu&quot;.
For bug reporting instructions, please see:
&lt;http://bugs.launchpad.net/gdb-linaro/&gt;...
Reading symbols from /home/minix/Project/C/language/test...done.
</code></pre></div>
<p>可以看到最后一句，gdb 从 test中读取到了 symbols。</p>

<p>更多关于GCC调试的描述可以在 GCC 文档的 <a href="http://gcc.gnu.org/onlinedocs/gcc/Debugging-Options.html">Debugging Options</a>中找到。</p>

<h2>优化</h2>

<p>GCC 可以对程序提供不同程度的优化，<code>-O0</code> 不提供任何优化，这也是默认的情况，从 <code>-O1</code> 到 <code>-O3</code>提供越来越多的优化，例如：</p>
<div class="highlight"><pre><code class="text language-text" data-lang="text">$ gcc -O1 test.c -o test
$ gcc -O3 test.c -o test
</code></pre></div>
<p>更多关于优化的信息可以在 GCC 文档的 <a href="http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html">Optimize Options</a>中找到。</p>

<p>好了，就讲到这里。</p>


      </article>

      <div class="comments">
        
          <div id="disqus_thread"></div>
 <script type="text/javascript">
     /* * * CONFIGURATION VARIABLES: EDIT BEFORE PASTING INTO YOUR WEBPAGE * * */
     var disqus_shortname = 'minixalpha'; // required: replace example with your forum shortname

     /* * * DON'T EDIT BELOW THIS LINE * * */
     (function() {
         var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
         dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js';
         (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
     })();
 </script>
 <noscript>Please enable JavaScript to view the <a href="http://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript>
    <a href="http://disqus.com" class="dsq-brlink">comments powered by <span class="logo-disqus">Disqus</span></a>
    

        
      </div>


      <footer>
        Copyright (c) minixalpha 2014
      </footer>

    </div>
  </body>
</html>
